/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hojadetrabajo4;

/**
 *
 * @author CarlosAndre
 */

public class Calculadora {

    private Stack<Float> pila;
    public static boolean instance_flag = false,error;
    private float primero, segundo,resultado;
    StackFactory<Float> sFactory = new StackFactory<Float>();
    
    public  Calculadora(String cadena) throws SingletonException {
       
        if (instance_flag)
            throw new SingletonException ("Se encontro mas de una clase");
        else{
            //Determina que ya existe 1 instancia.
            this.instance_flag=true;
            pila = sFactory.getStack(cadena);
        }
        
        
    }
    
    public void setPila(Stack<Float> stack){
        pila=stack;
        System.out.println(pila);
    }
     
    public void agregaNumero(float numero){
        pila.push(numero);
    }
    
    public float calcular (String cadena){
        if (pila.isEmpty()==false){
                primero=pila.peek();
                pila.pop();
                if (pila.isEmpty()==false){
                    segundo=pila.peek();
                    pila.pop();
                }
                else segundo=primero;
        }
        if (cadena.equals("+")){
            resultado=segundo+primero;
            pila.push(resultado);
        }
        else if (cadena.equals("-")){
            resultado=primero-segundo;
            pila.push(resultado);
        }
        else if (cadena.equals("*")){
            resultado=segundo*primero;
            pila.push(resultado);
        }
        else if (cadena.equals("/")){
            if (primero!=0){
                resultado=segundo/primero;
                pila.push(resultado);
                error=false;
            }
            else error=true;
        }
        return resultado;
       
       
    }
    public boolean error_math(){
        return error;
    }
    
    
    /**
     * Método que permite decir que ya no exite instanciación de cálculadora.
     * pre: Se debe finalizar el objeto.
     * post: Se finaliza el objeto.
     */
    public void finalize (){
        //limpia si se destruye.
        instance_flag = false;
    }
}

